/*Opciones de Cabecera*/
header{
	package pl.equipo13.p5;
}

/*Opciones generales a todo el fichero*/
options{
	
}

/*---------------------------------Sintactico---------------------------------*/
/*Definicion del analizador Sintactico*/
class AnasinFLEX extends Parser;
options{
	k = 2;
	importVocab = AnalexFLEX;
	defaultErrorHandler=false; //Control por defecto de excepciones, al ponerlo a false, no seran controladas en el .java generado.
}

// Regla de entrada
entrada_flex: sec_definicion SEPARADOR sec_reglas SEPARADOR sec_c EOF;

// Secciones
sec_definicion: (declaracion)* (codeblock_def)?;
sec_reglas: ((reglaOR | reglaparentesis)* (IDENT INC)? PUNTOCOMA)*;
sec_c: (funcion)*;

// Definicion
declaracion: IDENT RANGO;
codeblock_def: ACODEBLOCK (declaracion_cb)+ CCODEBLOCK;
declaracion_cb: tipo_dato IDENT PUNTOCOMA;

// Reglas
reglasimple: REFERENCIA (ASTERISCO | MAS)?;
reglaAND: (reglasimple)+;
reglaOR: reglaAND (OR reglaAND)*;
reglaparentesis: ABRIRPARENTESIS reglaOR CERRARPARENTESIS (ASTERISCO | MAS)?;

// Funciones
funcion:  tipo_dato IDENT ABRIRPARENTESIS argumentos CERRARPARENTESIS ABRIRLLAVE codigo CERRARLLAVE;
argumentos: VOID | ((COMA)? tipo_dato (ASTERISCO)? IDENT (ABRIRCORCHETE CERRARCORCHETE)?)*;
codigo: (asignacion | func PUNTOCOMA)*  RETURN NUMERO PUNTOCOMA;
asignacion: IDENT IGUAL (NUMERO | func) PUNTOCOMA;
func: IDENT ABRIRPARENTESIS ((COMA)? (IDENT (ARRAY)? | CADENA))*  CERRARPARENTESIS;

tipo_dato: ((SIGNED | UNSIGNED)? (INT | LONG | DOUBLE | FLOAT | LONG | SHORT)) | CHAR;